home *** CD-ROM | disk | FTP | other *** search
- #include "rtt.h"
-
- static struct node *node_free = NULL;
-
- /*
- * node0 - create a syntax tree leaf node.
- */
- struct node *node0(id, tok)
- int id;
- struct token *tok;
- {
- struct node *n;
- int i;
-
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
-
- n->nd_id = id;
- n->tok = tok;
- for (i = 0; i < NChildren; ++i)
- n->u[i].child = NULL;
- return n;
- }
-
- /*
- * node1 - create a syntax tree node with one child.
- */
- struct node *node1(id, tok, n1)
- int id;
- struct token *tok;
- struct node *n1;
- {
- struct node *n;
- int i;
-
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
-
- n->nd_id = id;
- n->tok = tok;
- n->u[0].child = n1;
- for (i = 1; i < NChildren; ++i)
- n->u[i].child = NULL;
- return n;
- }
-
- /*
- * node2 - create a syntax tree node with two children.
- */
- struct node *node2(id, tok, n1, n2)
- int id;
- struct token *tok;
- struct node *n1;
- struct node *n2;
- {
- struct node *n;
- int i;
-
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
-
- n->nd_id = id;
- n->tok = tok;
- n->u[0].child = n1;
- n->u[1].child = n2;
- for (i = 2; i < NChildren; ++i)
- n->u[i].child = NULL;
- return n;
- }
-
- /*
- * node3 - create a syntax tree node with three children.
- */
- struct node *node3(id, tok, n1, n2, n3)
- int id;
- struct token *tok;
- struct node *n1;
- struct node *n2;
- struct node *n3;
- {
- struct node *n;
- int i;
-
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
-
- n->nd_id = id;
- n->tok = tok;
- n->u[0].child = n1;
- n->u[1].child = n2;
- n->u[2].child = n3;
- for (i = 3; i < NChildren; ++i)
- n->u[i].child = NULL;
- return n;
- }
-
- /*
- * node4 - create a syntax tree node with four children.
- */
- struct node *node4(id, tok, n1, n2, n3, n4)
- int id;
- struct token *tok;
- struct node *n1;
- struct node *n2;
- struct node *n3;
- struct node *n4;
- {
- struct node *n;
- int i;
-
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
-
- n->nd_id = id;
- n->tok = tok;
- n->u[0].child = n1;
- n->u[1].child = n2;
- n->u[2].child = n3;
- n->u[3].child = n4;
- for (i = 4; i < NChildren; ++i)
- n->u[i].child = NULL;
- return n;
- }
-
- /*
- * node4 - create a syntax tree node for a variable. If the identifier
- * is in the symbol table, create a node that references the entry,
- * otherwise create a simple leaf node.
- */
- struct node *var_node(tok)
- struct token *tok;
- {
- struct sym_entry *sym;
- struct node *n;
-
- sym = sym_lkup(tok->image);
- if (sym != NULL) {
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
- n->nd_id = SymNd;
- n->tok = tok;
- n->u[0].sym = sym;
- ++sym->ref_cnt;
- /*
- * If this is the result location of an operation, note that it
- * is explicitly referenced.
- */
- if (sym->id_type == RsltLoc)
- sym->u.referenced = 1;
- return n;
- }
- else
- return node0(PrimryNd, tok);
- }
-
- /*
- * comp_nd - create a node for a compound statement.
- */
- struct node *comp_nd(tok, dcls, stmts)
- struct token *tok;
- struct node *dcls;
- struct node *stmts;
- {
- struct node *n;
-
- if ((n = node_free) == NULL)
- n = NewStruct(node);
- else
- node_free = node_free->u[0].child;
- n->nd_id = CompNd;
- n->tok = tok;
- n->u[0].child = dcls;
- n->u[1].sym = dcl_stk->tended; /* tended declarations are not in dcls */
- n->u[2].child = stmts;
- return n;
- }
-
- /*
- * free_tree - free storage for a syntax tree.
- */
- novalue free_tree(n)
- struct node *n;
- {
- int i;
- struct sym_entry *sym, *sym1;
-
- if (n == NULL)
- return;
-
- /*
- * Free any subtrees and other referenced storage.
- */
- switch (n->nd_id) {
- case SymNd:
- free_sym(n->u[0].sym); /* Indicate one less reference to symbol */
- break;
- case CompNd:
- /*
- * Compound node. Free ordinary declarations, tended declarations,
- * and executable code.
- */
- free_tree(n->u[0].child);
- sym = n->u[1].sym;
- while (sym != NULL) {
- sym1 = sym;
- sym = sym->u.tnd_var.next;
- free_sym(sym1);
- }
- free_tree(n->u[2].child);
- break;
- default:
- for (i = 0; i < NChildren; ++i)
- free_tree(n->u[i].child);
- }
- free_t(n->tok); /* free token */
- n->u[0].child = node_free; /* put node on free list */
- node_free = n;
- }
-